package com.birdboot.core;

import com.birdboot.controller.UserController;
import com.birdboot.http.HttpServletRequest;
import com.birdboot.http.HttpServletResponse;

import javax.activation.MimetypesFileTypeMap;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

/**
 * V8新增：
 * DispatcherServlet是由SpringMVC框架提供的一个Servlet类，用于Tomcat整合使用的类
 * 具体是接收处理请求的工作
 */
public class DispatcherServlet {
    //单例模式 (1)只需要一个实例、实例没有特殊属性（2）实例开销特别大
    private DispatcherServlet(){}
    private static DispatcherServlet instance = new DispatcherServlet();
    public static DispatcherServlet getInstance(){
        return instance;
    }

    private static File baseDir;
    private static File staticFile;
    static {
        try {
            baseDir = new File(DispatcherServlet.class.getClassLoader().getResource(".").toURI());// 定位类加载路径（固定写法）
            staticFile = new File(baseDir,"static");// 根据类加载路径定位static目录
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }

    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
//        String path = request.getUri();
//        不能使用getUri()了，这里可能含有参数，而参数不是固定信息
        String path = request.getRequestURI();
        System.out.println("抽象路径：" + path);

        // 先判断本次请求是否为请求业务，是业务就业务处理，不是业务去static目录下寻找文件
        if ("/regUser".equals(path)) {
            // 处理用户注册
            UserController controller = new UserController();
            controller.reg(request, response);
        } else if ("/loginUser".equals(path)) {
            //  处理用户登录
            UserController controller = new UserController();
            controller.login(request,response);
        } else {


            File file = new File(staticFile, path);
            if (file.isFile()) {
                response.setContentFile(file);
                response.addHeader("Server", "BirdBoot");
            } else {
                response.setStatusCode(404);
                response.setStatusReason("NotFound");          // 状态代码
                file = new File(staticFile, "404.html");   // 状态描述
                response.setContentFile(file);// 不用设置Content-Type和 Content-Length了，应为在setContentFile中只要有正文就会设置
                response.addHeader("Server", "BirdBoot");
            }
        }
    }
}
